#include <stdio.h>

const short arr_s[4] = {1, 2, 3, 4};
const int arr_i[4] = {1, 2, 3, 4};
const long arr_l[4] = {1L, 2L, 3L, 4L};

void init_arr(void);

void print_int_arr(char *name, int arr[], int length);

void print_short_arr(char *name, short arr[], int length);

void print_long_arr(char *name, long arr[], int length);

/**
 * 可以用数组开始的地址和数组结束的地址来访问数组
 * @param start 数组的开始地址
 * @param end 数组的结束地址
 */
void arr_show(int *start, int *end);

void arr_state();

/**
 * 数组的操作都是有状态的 因为数据传参都是传递的指针
 */
void arr_stateful_op(int *arr, int size);

/**
 * 数组使用const申明 则该数组代码中如果有写操作 则在编译期间就会报错
 */
void arr_protected(const int arr[], int size);

int main(void)
{
    arr_state();
    return 0;
}

void init_arr(void)
{
    int arr_0[4];
    int arr_1[] = {1, 2, 3, 4, 5};
    // 初始化任意一个值后 其他值会被初始化为0
    int arr_2[4] = {[2]=233};

    print_int_arr("arr_0", arr_0, 4);
    print_int_arr("arr_1", arr_1, 4);
    print_int_arr("arr_2", arr_2, 4);
}

void print_int_arr(char *name, int *arr, int length)
{
    for (int i = 0; i < length; ++i)
    {
        printf("array: [%s] --- index: [%d], value: [%d]\n", name, i, arr[i]);
    }
    printf("\n");
}

void print_short_arr(char *name, short arr[], int length)
{
    for (int i = 0; i < length; ++i)
    {
        printf("array: [%s] --- index: [%d], value: [%hd], local: [%p]\n", name, i, arr[i], &arr[i]);
    }
    printf("\n");
}

void print_long_arr(char *name, long arr[], int length)
{
    for (int i = 0; i < length; ++i)
    {
        printf("array: [%s] --- index: [%d], value: [%ld], local: [%p]\n", name, i, arr[i], &arr[i]);
    }
    printf("\n");
}

void arr_show(int *start, int *end)
{
    int val;

    while (start < end)
    {
        val = *start;
        printf("val: [%d]\n", val);
        start++;
    }
}

void arr_state()
{
    const int size = 4;
    int stateful[] = {1, 2, 3, 4};

    print_int_arr("初始值", stateful, size);

    // 执行数据变化操作
    arr_stateful_op(stateful, size);

    print_int_arr("操作后", stateful, size);

    arr_protected(stateful, size);
}

void arr_stateful_op(int arr[], int size)
{
    for (int i = 0; i < size; ++i)
    {
        arr[i]++;
    }
}

void arr_protected(const int arr[], int size)
{
    for (int i = 0; i < size; ++i)
    {
        // arr[i]++;
    }
}
